#include <stdio.h>

void main(void)
{
    // struct 结构占用的存储空间，不是各个属性存储空间的总和，而是最大内存占用属性的存储空间的倍数，其他属性会添加空位与之对齐。这样可以提高读写效率。
    struct foo
    {
        int a;
        char *b;
        char c;
    };
    // 上面示例中，struct foo有三个属性，在64位计算机上占用的存储空间分别是：int a占4个字节，指针char* b占8个字节，char c占1个字节。
    // 它们加起来，一共是13个字节（4 + 8 + 1）。
    // 但是实际上，struct foo会占用24个字节，原因是它最大的内存占用属性是char* b的8个字节，导致其他属性的存储空间也是8个字节，这样才可以对齐，
    // 导致整个struct foo就是24个字节（8 * 3）
    printf("%ld\n", sizeof(struct foo)); // 24

    struct bar
    {
        char c;
        int a;
        char *b;
    };
    // 定义 Struct 结构体时，可以采用存储空间递增的顺序，定义每个属性，这样就能节省一些空间
    printf("%ld\n", sizeof(struct bar)); // 16

    // 结构体的最终大小必须是其“最大成员对齐值”的整数倍
    // 编译器插填充字节，只为保证“每个成员都能落在自己的对齐边界”上
}